package br.com.os2.pacemark.dao;

import br.com.os2.pacemark.model.Produto;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.List;

/**
 *
 * Classe ConvenioDAO, extende a classe DAOGenerico para obeter 
 * recursos de conexão e excução de consultas e comandos.
 * 
 * Responsável por gerenciar acesso ao banco de dados relacionados a 
 * Entidade Convenio.
 * 
 * @author Daniel
 * 
 */
public class ProdutoDAO extends DAOGenerico {
   
    /**
     * Método para inserir um produto.
     * 
     * @param produto Objeto produto a ser inserido.
     * @return boolean indica se o método foi executado com sucesso.
     * 
     **/
    
    public boolean inserir(Produto produto){
     
        produto.setId(getNextId("produtos"));
        
        return executarComando("INSERT INTO produtos (id, nome, lote,quantidade, "
                             + "estoque_critico, vencimento) "
                             + "VALUES (?,?,?,?,?,?)"
                             , produto.getId(), produto.getNome()
                             , produto.getLote() ,produto.getQuantidade()
                             , produto.getEstoqueCritico(), new java.sql.Date(produto.getVencimento().getTime()));
        
    }
    
    /**
     * Método para atualizar informações de um produto.
     * 
     * @param produto Objeto produto a ser atualizado.
     * @return boolean indica se o método foi executado com sucesso
     * 
     **/
    
    public boolean atualizar(Produto produto){
     
        return executarComando("UPDATE produtos SET nome = ?, lote = ?, quantidade = ?, "
                             + "estoque_critico = ?, vencimento = ? WHERE id = ?"
                             , produto.getNome(), produto.getLote(), produto.getQuantidade()
                             , produto.getEstoqueCritico(), new java.sql.Date(produto.getVencimento().getTime())
                             , produto.getId());
        
    }
    
    /**
     * Método para excluir um produto.
     * 
     * @param produto Objeto produto a ser excluído.
     * @return boolean indica se o método foi executado com sucesso
     * 
     **/
    
    public boolean excluir(Produto produto){
    
        return executarComando("DELETE FROM produtos WHERE id = ?", produto.getId());
        
    }
    
    /**
     * Método para excluir um produto.
     * 
     * @param id ID do objeto a ser excluído
     * @return boolean indica se o método foi executado com sucesso
     * 
     **/
    
    public boolean excluir(int id){
    
        return executarComando("DELETE FROM produtos WHERE id = ?", id);
        
    }
    
    /**
     * Método para buscar o produto pelo ID
     * 
     * @return Produto correspondente ai ID, se não for encontrado retorna null.
     * 
     * @param id inteiro que representa o ID do produto na tabela
     * 
     **/
    
    public Produto getById(int id){
    
        ResultSet rs = executarConsulta("SELECT * FROM produtos WHERE id = ?", id);
        
        Produto produto = null;
        
        try {
            
            if(rs.next()){
                
                produto = polularInformacoes(rs);
                
            }
            
        } catch (SQLException ex) {
            
            System.err.println("ERRO AO BUSCAR PRODUTO POR ID");
            
        }finally{
            
            try {
                
                rs.close();
                connection.close();
                
            } catch (SQLException ex) {
                
                
                
            }
            
        }
        
        return produto;
        
    }
    
    /**
     * Método para listagem de produtos.
     * 
     * @return Retorna uma lista de produtos com o resultado da consulta
     * 
     **/
    
    public List<Produto> listar(){
    
        List<Produto> produtos = new ArrayList<>();
        
        ResultSet rs = executarConsulta("SELECT * FROM produtos");
        
        try {
            
            while(rs.next()){
                
                produtos.add(polularInformacoes(rs));
                
            }
            
        } catch (SQLException ex) {
            
            System.err.println("ERRO AO PERCORER RESULT_SET");
            
        }finally{
            
            try {
                
                rs.close();
                connection.close();
                
            } catch (SQLException ex) {
                
                
                
            }
            
        }
            
        return produtos;
        
    }
    
     /**
     * Método para listagem de produtos por nome.
     * 
     * @return Retorna uma lista de produtos com o resultado da consulta
     * 
     * @param nome Variável para pesquisa
     * 
     **/
    
    public List<Produto> listar(String nome){
    
        List<Produto> produtos = new ArrayList<>();
        
        ResultSet rs = executarConsulta("SELECT * FROM produtos WHERE UPPER(nome) LIKE ?", "%"+nome.toUpperCase()+"%");
        
        try {
            
            while(rs.next()){
                
                produtos.add(polularInformacoes(rs));
                
            }
            
        } catch (SQLException ex) {
            
            System.err.println("ERRO AO PERCORER RESULT_SET");
            
        }finally{
            
            try {
                
                rs.close();
                connection.close();
                
            } catch (SQLException ex) {
                
                
                
            }
            
        }
            
        return produtos;
        
    }
    
    /**
     * Método para preencher informações de um produto com resultados do 
     * banco de dados.
     * 
     * @param rs ResultSet com o resultado de uma consulta SQL
     * 
     * @return Retorna um produto populado com informações vindas do banco de 
     *  dados
     * 
     **/
    
    public Produto polularInformacoes(ResultSet rs){
    
        Produto produto = new Produto();
        
        try {
            
            produto.setId(rs.getInt("id"));
            produto.setNome(rs.getString("nome"));
            produto.setLote(rs.getString("lote"));
            produto.setQuantidade(rs.getInt("quantidade"));
            produto.setEstoqueCritico(rs.getInt("estoque_critico"));
            produto.setVencimento(rs.getDate("vencimento"));
            
        } catch (SQLException ex) {
            
            System.err.println("ERRO AO PULULAR PRODUTO");
            
        }
        
        return produto;
        
    }
    
}
